RAID groups are logical representations of disk arrays created by binding individual physical disks together to form the RAID groups. RAID groups represent a logically contiguous address space distributed across a set of physical disks. Each physical disk is subdivided into pieces used to spread the address space of the RAID group across the group (along with parity information if applicable to the RAID level). The physically contiguous pieces of the physical disks that are joined together to create the logically contiguous address space of the RAID group are called stripes.
Applications access and store data incrementally by use of logical storage array partitions, known as logical units (LUNs). LUNs are exported from a RAID array for use at the application level. For traditional systems, LUNs always map to physically provisioned contiguous storage space. This physical provisioning results from the fact that traditional LUN mapping technologies bind LUNs from RAID groups using static mapping. Static mapping provides that a LUN is defined by a start position in a RAID group and that the LUN extends for its size from that position contiguously in the RAID group's address space. This static mapping yields a logical unit mapping of 1:1 for logical to physical mapping of blocks from some start point in the RAID group's address space on the array.
Because this mapping was simple, it was viewed as the most efficient way to represent a logical unit in any system from the point of view of raw input/output (I/O) performance. The persistent definition of the logical unit as a contiguously provisioned unit made it manageable for storage and retrieval, but imposed limits the scalability of data storage systems.
However, while the persistent nature of the LUN defined in this manner has been manageable for storage and retrieval, it has become inefficient with the increased usage of layered applications. Layered applications may be characterized by an environment where different versions of data must be maintained and moved around a system quickly and in a transparent manner. Control of the placement of data has become more important. The ability to quickly and efficiently represent different versions of a LUN is also starting to become a more important factor to optimize due to customer needs for quick data recovery after system failures.
As well, there is no provision for sharing of data segments on the array in traditional systems. Snapshots are often used in storage systems to identify changes in the storage contents over time. When snapshots are used for point-in-time copies, LUNs are copied in their entirety along with a set of changes that describe the original structure of the LUN, either from its creation or from the last snapshot. In order to preserve the original structure of the logical unit for that point in time, blocks are copied on the first write reference (copy on first write) to a special save area reserved to hold these “historical” blocks of data. This copy involves a read/write cycle that causes significant performance disruption just after the point in time copy is created against an actively changing production logical unit. The disruption may continue for some amount of time until most of the copying is completed and sometimes this can last for hours. In an array environment where snapshots are constantly being created, the performance impacts of traditional systems become significant.
Accordingly, in light of these difficulties associated with conventional RAID array LUN provisioning, there exists a need for improved methods, systems, and computer program products for dynamic mapping of logical units in a RAID environment.